package main

import "fmt"

/**
指针
1、一个指针的值是另一个变量的地址。一个指针对应变量在内存中的存储位置。
2、并不是每一个值都会有一个内存地址，但是对于每一个变量必然有对应的内存地址。
3、通过指针，可以直接读或者更新对应变量的值，从而不需要知道该变量的名字（如果变量有名字的话）
4、在结构体、数组中的每一个元素，都是对应的一个变量，因此可以被取地址。
5、任何类型的指针的零值都是nil。
6、判断指针是否相等（只有当指针指向同一个变量或者，全部是nil的时候才相等）

变量声明：  		var x int
取内存地址表达式： &x
指针对应数据类型： *int
*/

func main() {

	// 1、定义一个变量x
	x := 1
	// 2、指针p，此时p表示是指向变量x的内存地址
	p := &x
	// 3、*p表达式表示的是，p指针指向变量x的值
	fmt.Println(*p)

	// 4、调用 f()函数，返回值类型是int类型指针，每次输出的pt值都不相同。
	// 因为：指针包含了一个变量的地址，如果将指针作为参数调用函数，将可以在函数中通过该指针来更新变量的值。
	var pt = f()
	fmt.Println(pt)

	// 5、通过指针来更新变量的值，然后返回更新后的值
	v := 1
	// 调用修改变量的函数，此时这里的 v的值是2
	incr(&v)
	// 再调用一次，并打印输出，v值是3了
	fmt.Println(incr(&v))

}

func f() *int {
	v := 1
	return &v
}

func incr(p *int) int {
	// 只是增加p指向的变量的值，并不改变p指针
	*p++
	return *p
}
